package com.aliyun.commons.service;

import java.util.List;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

import org.springframework.validation.annotation.Validated;

/**
 * Redis 服务
 *
 * 
 * @date 2024/11/26
 */
@Validated
public interface CacheService {

    /**
     * set value （设置值）
     *
     * @param key           钥匙
     * @param value         价值
     * @param expireSeconds 过期秒数
     */
    void setValue(@NotBlank(message = "key cannot be empty") String key,
        @NotNull(message = "value cannot be null") Object value, long expireSeconds);

    /**
     * 获取值
     *
     * @param key 钥匙
     * @return {@link T }
     */
    <T> T getValue(@NotBlank(message = "key cannot be empty") String key,
        @NotNull(message = "value cannot be null") Class<T> clazz);

    /**
     * 删除键
     *
     * @param key 钥匙
     */
    void deleteKey(@NotBlank(message = "key cannot be empty") String key);

    /**
     * 获取计数器的当前值
     *
     * @param key 计数器的键
     * @return 当前计数器值
     */
    Integer getCounter(String key);

    /**
     * 初始化计数器
     *
     * @param key           计数器的键
     * @param initialValue  初始值
     * @param expireSeconds 过期秒数
     */
    void initCounter(String key, int initialValue, long expireSeconds);

    /**
     * 增量计数器
     *
     * @param key       钥匙
     * @param increment 增加
     */
    void incrementCounter(String key, int increment);

    /**
     * 执行 Lua 脚本
     *
     * @param script 脚本
     * @param keys   钥匙
     * @param args   参数
     * @return int
     */
    Long executeLuaScript(String script, List<String> keys, Object... args);
}
